# 嘿! 我这是要跟系统来一场精心谈话,os模块就是我的"翻译官",
# 妈妈再也不用担心我没法在写代码的时候跟系统说话了!
import os

# 嘿!!! tkinter就是我的图形界面秘籍,你也可以去查阅官方文档,
# 看懂武林秘籍! 而ttk和messagebox就像我的两大法宝，一个负责美颜，
# 一个负责传话，让我的程序既好看又好聊！
import tkinter as tk
from tkinter import ttk, messagebox
import time as ti

class Toothie:
    def __init__(self):
        self.Window = tk.Tk()
        self.Window.title("Toothie's System Tools 牙牙君の系统工具!")  # 给我的窗口挂上闪亮的招牌：“Toothie”在此！
        self.Window.geometry("500x300")  # 空间不大不小，刚好装下我们的奇思妙想！
        # 等下,我日志呢!?
        self.LogConsole = tk.Tk()
        self.LogConsole.title("日志记录")
        self.LogConsole.geometry("300x300") # 空间应该足够,不够就凉拌((()))
        #首先,获取脚本所在目录的绝对路径
        self.ScriptPath = os.path.abspath(__file__)
        #创建一个独一无二的日志文件,使用time格式化字符串,在Windows系统中,因为日期巨长,使用\\\\?\\UNC路径,避免超出MAX_PATH
        # (此处为Windows系统特有的UNC长路径)
        if os.name == "nt":
            # 保存文件
            self.LogFileAdd = f"{self.ScriptPath}\\{ti.strftime('%y_%m_%d__%H_%M_%S', ti.localtime())}"
            self.LogFileAdd = str(self.LogFileAdd)
            os.system(f"echo \"在{ti.strftime('%Y 年 %m 月 %d 日 %H:%M:%S', ti.localtime())},文件被创建 On The Windows OS\"")
        else:
            self.LogFileAdd = f"{self.ScriptPath}/{ti.strftime('%y_%m_%d__%H_%M_%S', ti.localtime())}"
            self.LogFileAdd = str(self.LogFileAdd)
            os.system(f"echo \"在{ti.strftime('%Y 年 %m 月 %d 日 %H:%M:%S', ti.localtime())},文件被创建 On The Linux/Unix/Unix-like OS\"")
        # 待会儿创建一个函数,用来写日志
        self.LogIcon = {
            "Info":"messagebox.showinfo",
            "Warning":"messagebox.showwarning",
            "Error":"messagebox.showerror",
            "Question":"messagebox.askquestion",
            "Cancel":"messagebox.askokcancel",
            "YesOrNo":"messagebox.askyesno"
        }
    def WirteLog(self, Log="Info:Log Is Empoty", Info="Info is Null",Icon="NULL"):
        # 写日志,使用time格式化字符串,在Windows系统中,因为日期巨长,使用\\\\?\\UNC路径,避免超出MAX_PATH
        # (此处为Windows系统特有的UNC长路径)
            ttk.Label(self.LogConsole, text=f"==============Log==============")
            ttk.Label(self.LogConsole, text=f"echo \"在{ti.strftime('%Y 年 %m 月 %d 日 %H:%M:%S', ti.localtime())},有一个信息:\"{Info}\",该信息是日志消息,图标为:{Icon},")
            ttk.Label(self.LogConsole, text=f"日志内容为:\"{Log}\",")
            ttk.Label(self.LogConsole, text=f"该日志报告完毕.")

    ##################################################
    def RunCommand(self, CommandForWindows: str, CommandForBash: str):
        # 我可是双语大师，无论是Windows还是*nix(此处代表Linux,Unix,Unix-Like)，都能应对自如！
        # 󠁅（󠁅此󠁅处󠁅无󠁅字󠁅胜󠁅有󠁅字󠁅）󠁅
        if os.name == "nt":
            os.system(CommandForWindows)
        else:
            os.system(CommandForBash)
    ##################################
    def AddObjectHosts(self):
        # 开始吧!
        self.AddObject = tk.Tk()
        self.AddObject.title("添加Object君向导 - For Edit Hosts File")
        self.AddObject.geometry("400x300")
        #添加一行一行字(这也太114514了(BUSHI)),顺便把间距调成10px
        self.AddObjectHostsWelcomeLabel = ttk.Label(self.AddObject, Text="欢迎来到添加Object君向导!!!").pack()
        #还有取消按钮
        self.AddObjectHostsButtonCancel = ttk.Button(self.AddObject, 
                                                         text="取消", 
                                                         command=lambda: self.AddObject).pack(pady=10)

    ##################################################
    def EditorHosts(self, ForWindows: str, ForUnix_like: str):
        self.EditorHostsWindow = tk.Tk()  # 新开一扇窗，专供我们“调教”hosts文件！

        self.EditorHostsWindow.title("hosts文件编辑器")  # 窗口标题得醒目，让人一眼认出这是干啥的！

        self.Object_Hosts = {}  # 先放个占位符，表示我们的Object君还没登场！

        self.EditorHostsWindow.geometry("500x300")
        # 咱们得先看看是哪位“大侠”(系统)在掌舵,再决定如何优雅地打开hosts文件!
        if os.name == "nt":
            # 注意:由于权限控制,可能需要以Adminstartor/Superuser/TrustedInstaller等权限运行,
            # 否则可能会因为权限不够而导致报错o[T﹏To]
            with open(ForWindows, "r") as file:
                self.Hosts_Content = file

            # 得到了数据,还得稍微打磨一下,按照\n分开成列表,
            # 然后遍历列表的每一行,把#开头的删除
            # 哎呀,这hosts文件里可不能藏小秘密(注释),都给我挑出来！
            for i in self.Hosts_Content:
                if i.startswith("#"):
                    self.Object_Hosts.pop(i)
                else:
                    self.Object_Hosts[i] = i
        else:
                        # 注意:由于权限控制,可能需要以Adminstartor/Superuser/TrustedInstaller等权限运行,
            # 否则可能会因为权限不够而导致报错o[T﹏To]
            with open(ForWindows, "r") as file:
                self.Hosts_Content = file

            # 得到了数据,还得稍微打磨一下,按照\n分开成列表,
            # 然后遍历列表的每一行,把#开头的删除
            # 哎呀,这hosts文件里可不能藏小秘密(注释),都给我挑出来！
            for i in self.Hosts_Content:
                if i.startswith("#"):
                    self.Object_Hosts.pop(i)
                else:
                    self.Object_Hosts[i] = i
        

        # 创建一点按钮... 来，给用户们献上几个神奇的小按钮，让他们van↗得开心！
        self.HostsEditor_AddButton = ttk.Button(
                self.EditorHostsWindow, text="添加一个Object君!",
                command=lambda: self.AddObjectHosts()
            ).pack()

        # 然后,就是看列表是否是空,如果是空,那么就(搞一个超级无敌吊炸天的)
        # 提示:哎呀,这Hosts文件还是个"小瘦子",我们给他喂点食物(其实就是Object君)吧!
        if len(self.Object_Hosts) == 0:
            # 提示:哎呀,这Hosts文件还是个"小瘦子",我们给他喂点食物(其实就是Object君)吧!
            ttk.Label(
                self.EditorHostsWindow,
                text="哎呀,这Hosts文件还是个\"小瘦子\",我们给他喂点食物(其实就是Object君)吧!"
            ).pack()
        #略
        # 开始!!!Mainloop!
        self.EditorHostsWindow.mainloop()  # 好戏开场，让主循环带我们飞起来！

    ###################################################
    def EditorAutorun(self):
        self.EditorAutorunWindow = tk.Tk()
        # 略
    ###################################################
    def ShowButton(self):
        # 清理缓存文件按钮，一键告别凌乱，让电脑瞬间清爽如新！
        self.RmTemp = ttk.Button(
            self.Window,
            text="清理缓存文件",
            command=lambda: self.RunCommand(
                "del /f /s /q %USERPROFILE%\\AppData\\Local\\Temp\\*",
                "rm -rf /tmp/*"
            )
        ).pack()
        self.WirteLog(
            Log="显示按钮(bid:rmtmp)成功",
            Info="调用成功",
            Icon="Info"
        )

        # 编辑hosts文件，快速访问网站，让你的网络世界自由飞翔！
        self.EditHosts = ttk.Button(
            self.Window,
            text="编辑hosts文件,快速访问网站",
            command=lambda: self.EditorHosts(
                "%WINDIR%\\System32\\drivers\\etc\\hosts",
                "/etc/hosts"
            )
        ).pack()
        self.WirteLog(
            Log="显示按钮(bid:edithosts)成功",
            Info="调用成功",
            Icon="Info"
        )

        # 编辑自动autorun.inf，个性化属于你的U盘，让它独一无二，彰显个性！
        self.EditAutoRun_inf = ttk.Button(
            self.Window,
            text="编辑自动autorun.inf,个性化属于你的U盘",
            command=lambda: self.EditorAutorun("")
        ).pack()
        self.WirteLog(
            Log="显示按钮(bid:editautorun)成功",
            Info="调用成功",
            Icon="Info"
        )
        self.WirteLog(
            Log="窗口运行中...\n如果没有看到==...==日志记录完毕==...==代表窗口被异常关闭",
            Info="调用成功",
            Icon="Info"
        )
        # 最后的压轴大戏，启动主循环，让程序舞动起来，嗨翻全场chang hang ang ng g！
        self.Window.mainloop()
        self.WirteLog(
            Log="窗口运行结束",
            Info="运行结束",
            Icon="Info"
        )

if __name__ == "__main__":
    Toothie().ShowButton()  # 登场！让我们的Toothie闪亮登场，开始它的表演吧!
    Toothie().WirteLog(
        Log="程序运行结束\n=============日志记录完毕===========",
        Info="运行结束",
        Icon="Info"
    )